//防止冲突 闭包
let _sub = (function () {
  //发布订阅类
  class Sub {
    constructor() {
      //创建事件池 存储后期需要执行的方法
      this.pond = [];
    }
    add(fn) {
      if (typeof fn == "function") {
        this.pond.some((x) => x === fn) ? null : this.pond.push(fn);
        // console.log(this.pond);
      } else {
        throw new Error("argument is not function");
      }
    }
    remove(fn) {
      //   console.log(this.pond);
      //移除的时候赋值为null、、fire执行的时候再进行判断
      this.pond = this.pond.map((x) => (fn === x ? null : x));
    }
    fire(...args) {
      //   console.log(args);
      //   console.log(this.pond)
      this.pond.forEach((x) => x && x(...args));
    }
  }

  return function () {
    return new Sub();
  };
})();

let pond = _sub();
let fn1 = function () {
  console.log(1);
};
let fn2 = function () {
  console.log(2);
  pond.remove(fn1);
};
let fn3 = function () {
  console.log(3);
};
let fn4 = function () {
  console.log(4);
};
// console.log(pond)

pond.add(fn1);
pond.add(fn2);
pond.add(fn3);
pond.add(fn4);
pond.add(fn1);
// pond.remove(fn1);
// pond.remove(fn1);
// pond.remove(fn1);
// pond.add(1);
pond.fire(123);
pond.fire(123);
